import { useMemberStore } from "@/stores"

//设置基地址与拦截器
const baseURL = 'https://pcapi-xiaotuxian-front-devtest.itheima.net'

//请求拦截器
uni.addInterceptor('request', {
    //拦截前触发
    invoke(args: UniApp.RequestOptions) {
        //不是http开头的基地址就拼接
        if (args.url.startsWith('http') === false) {
            args.url = baseURL + args.url
        }
        //设置请求超时
        args.timeout = 100000
        //给请求头添加Authorization
        args.header = {
            'source-client': 'miniapp',
            ...args.header
        }
        //获取token
        const store = useMemberStore()
        const token = store.profile?.token
        if (token) {
            args.header.Authorization = token
        }
    }
})

//请求拦截器
uni.addInterceptor('uploadFile', {
    //拦截前触发
    invoke(args: UniApp.RequestOptions) {
        //不是http开头的基地址就拼接
        if (args.url.startsWith('http') === false) {
            args.url = baseURL + args.url
        }
        //设置请求超时
        args.timeout = 10000
        //给请求头添加Authorization
        args.header = {
            'source-client': 'miniapp',
            ...args.header
        }
        //获取token
        const store = useMemberStore()
        const token = store.profile?.token
        if (token) {
            args.header.Authorization = token
        }
    }
})

//定义泛型
type ResDateType<T> = {
    code: string,
    msg: string,
    result: T
}
//封装请求函数
export function http<T>(options: UniApp.RequestOptions) {
    //返回Promise对象
    return new Promise<ResDateType<T>>((resolve, reject) => {
        //调用uni.request请求方法
        uni.request(
            {
                ...options,
                //请求成功
                success: (res) => {
                    //状态码为200-299则是请求成功
                    if (res.statusCode >= 200 && res.statusCode < 300) {
                        resolve(res.data as ResDateType<T>)
                    }
                    else if (res.statusCode === 401) {
                        //如果响应状态码是401，就调用store里面的clearProfile方法清除token
                        const store = useMemberStore()
                        store.clearProfile()
                        //跳转到登录页
                        uni.navigateTo({
                            url: '/pages/login/login'
                        })
                        reject(res)
                    }
                    else {
                        //其他错误
                        uni.showToast({
                            title: '网络发送了错误',
                            icon: 'none'
                        })
                        reject(res)
                    }
                },
                //失败
                fail: (error) => {
                    //提示用户
                    uni.showToast({
                        title: '网络请求失败',
                        icon: 'none'
                    })
                    reject(error)
                }
            }
        )

    })
}
